package main

import (
	"fmt"
	"net"
	"time"
)

// 本机IP，用于找到对应的网卡，再通过该网卡在局域网中通过ARP广播查找目标MAC对应的IP
var LocalIP = "192.168.1.120"
var MAC = "00:E0:99:FE:0E:9B" // 已知局域网中目标设备的MAC地址

func main() {
	// 获取本机网卡信息
	ifaces, err := net.Interfaces()
	if err != nil {
		fmt.Println("获取网卡信息失败:", err)
		return
	}

	var localMac net.HardwareAddr
	var ifaceName string

	// 查找与本机IP对应的网卡
	for _, iface := range ifaces {
		addrs, err := iface.Addrs()
		if err != nil {
			continue
		}

		for _, addr := range addrs {
			if ipnet, ok := addr.(*net.IPNet); ok && ipnet.IP.String() == LocalIP {
				localMac = iface.HardwareAddr
				ifaceName = iface.Name
				break
			}
		}
	}

	if localMac == nil {
		fmt.Println("未找到对应的网卡")
		return
	}

	fmt.Printf("本机网卡: %s, MAC地址: %s\n", ifaceName, localMac)

	// 通过ARP广播查找目标MAC对应的IP
	targetIP := net.ParseIP("192.168.1.235") // 目标IP为192.168.1.235
	if targetIP == nil {
		fmt.Println("目标IP地址无效")
		return
	}

	// 发送ARP请求（修正append参数，直接构造字节切片）
	// 这里只是演示，实际ARP包建议用gopacket等库构造
	arpPacket := []byte{
		// Ethernet header
		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // 目标MAC: 广播
	}
	arpPacket = append(arpPacket, localMac...) // 源MAC
	arpPacket = append(arpPacket, 0x08, 0x06)  // EtherType: ARP
	// ...此处省略ARP包体构造...

	// 这里只是演示，实际不能直接用net.Dial("arp", ...)，标准库不支持ARP协议
	// 下面代码仅为结构修正，实际ARP建议用gopacket/pcap实现
	fmt.Println("ARP请求包已构造（未真正发送），长度：", len(arpPacket))

	// 模拟等待响应
	time.Sleep(1 * time.Second)
	fmt.Println("（演示）未收到ARP响应: 标准库不支持ARP协议，建议用gopacket/pcap实现ARP探测。")
}
